#Regular Expression 正则表达式
import re
#1、search函数
#search('正则表达式"，字符串')按照正则表达式去匹配字符串
#如果可以匹配上就返回匹配的对象
#如果匹配不上就返回None
# s='abcdefg'
# result = re.search('cde',s)
# print(result)
# result = re.search('edc',s)
# print(result)
#2、可以利用search函数的结果来判断有没有匹配到内容
# import re
# while True:
#     n='0123456789'
#     x=input('请输入一个数字')
#     result=re.search(f'{x}',n)
#     if result!=None:
#         print(f'{x}是一个数字')
#     else:
#         print(f'{x}不是一个数字')
#3、正则表达式的格式符
#[0-9]代表匹配1个任意数字
#[a-z]代表匹配1个任意小写字母
#[a-z|A-Z] #代表匹配1个任意字母
#.代表匹配1个任意字符

#案例1、编写一个函数f1，接受字符串s
#判断字符串s中有没有，b开头，d结尾，中间是1个任意字符的内容
# import re
# def f1(s):
#    result=re.search('b.d',s)
#    if result!=None:
#        print('匹配到了')
#    else:
#        print('没匹配到')
# f1('abcdefg')
# f1('招笑吧b1d牢弟')
# f1('666b哈d888')
# f1('abc699defg')
# f1('ab/defg')
# f1('b d')
#{n}    代表前面的字符匹配n次
    #.{5}   代表匹配5个任意字符
    #[0-9]{5}   代表匹配5个任意数字
#案例2、编写一个函数f1，接受字符串s
#判断字符串s中有没有，b开头，d结尾，中间是5个任意字符的内容
# import re
# def f1(s):
#    result=re.search('b.{5}d',s)
#    if result!=None:
#        print('匹配到了')
#    else:
#        print('没匹配到')
# f1('b12345d')
# f1('b哈哈哈哈哈d')
# f1('bqwertd')
# f1('b/= -+d')
# f1('bqwertmmmd')

#{m,n}代表前面的字符匹配m到n次
#.{1,3}代表匹配1到3个任意字符
#[a-z]{3,5}代表匹配3到5个任意小写字母
#系例3、编写一个函数f1，接受字符串s
#判断字符串s中有没有，b开头，d结尾，中间是4-6个任意字符的内容
# import re
# def f1(s):
#    result=re.search('b.{4,6}d',s)
#    if result!=None:
#        print('匹配到了')
#    else:
#        print('没匹配到')
# f1('b123d')
# f1('b哈哈哈哈d')
# f1('bqwertd')
# f1('b/= -+.d')
# f1('bqwertmmd')


# +代表匹配1或n次
    # .+代表匹配任意长度的任意非空字符
# *伐表匹配θ或n次
    # .*代表匹配任意长度的任意字符，可以是空字符串
#案例4.1、编写一个函数f1，接受字符串s
#判断字符串s中有没有，b开头，d结尾，中间是任意个(不能是0个)任意字符的内容
# import re
# def f1(s):
#    result=re.search('b.+d',s)
#    if result!=None:
#        print('匹配到了')
#    else:
#        print('没匹配到')
# f1('bd')
# f1('b123d')
# f1('b哈哈哈哈d')
# f1('bqwertd')
# f1('b/= -+.d')
# f1('bqwertmmd')
#案例4.2、编写一个函数f1，接受字符串s
#判断字符串s中有没有，b开头，d结尾，中间是任意个(可以是0个)任意字符的内容
# import re
# def f1(s):
#    result=re.search('b.*d',s)
#    if result!=None:
#        print('匹配到了')
#    else:
#        print('没匹配到')
# f1('bd')
# f1('b123d')
# f1('b哈哈哈哈d')
# f1('bqwertd')
# f1('b/= -+.d')
# f1('bqwertmmd')
#\A表示字符串开始
#\Z表示字符串结尾
#案例5、编写一个函数f1，接受字符串s
#判断字符串s中是否符合以下规则，第1个字母是b，最后1个字母是d，中间是任意个(可以是0个)任意字符的内容
# import re
# def f1(s):
#    result=re.search('\Ab.*d\Z',s)
#    if result!=None:
#        print('匹配到了')
#    else:
#        print('没匹配到')
# f1('666b1d')
# f1('b123d')
# f1('b哈哈哈哈d999')

#4、group函数，获取匹配到的结果
# s='{"empno":"7839","ename":"smith","job":"clerk"}'
# result=re.search('"empno":"(.*)","ename":"(.*)","job":"(.*)"',s)
#
# print(result.group(0))  #group(0)返回整段匹配的字符串
# print(result.group(1))  #group(1)返回第1个括号
# print(result.group(2))  #group(2)返回第2个括号
# print(result.group(3))  #group(3)返回第3个括号
# print(result.group(4))  #报错，没有第4个括号

#5、?表示非贪婪模式，匹配最短字符串
#正则表达式默认匹配最长字符串
#加上?，就匹配从左到右第一个匹配的字符串

s='adsfbasfadjahghjasjgaljfalb'
result=re.search('a.*b',s)
print(result.group(0))

s='adsfbasfadjahghjasjgaljfalb'
result=re.search('a.*?b',s)
print(result.group(0))

#实用案例：写一个函数get_str_by_re，接受3个参数left,right,string
    #返回结果是从string中匹配 左边是left，右边是right，中间是任意内容的字符串
    #string='abcdefgabcd' left='b' right='d' ，返回 'c'
    #string='abcdefgabcd' left=没有 right='d'，返回'abc'
    #string='abcdefgabcd' left='d' right=没有，返回'efgabcd'
# import re
# def get_str_by_re(left='\A',right='\Z',string=''):
#     result = re.search(f'{left}(.*?){right}',string)
#     if result !=None:
#         return result.group(1)
#     else:
#         return '没有找到相匹配的内容'
#
# print(get_str_by_re(left='b',right='d',string='abcdefgabcd'))
# print(get_str_by_re(right='d',string='abcdefgabcd'))
# print(get_str_by_re(left='b',string='abcdefgabcd'))
# print(get_str_by_re(left='a',right='z',string='abcdefgabcd'))